/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.client.assembler.input;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

import fr.generali.accueilclient.client.om.IClientProfessionnel;
import fr.generali.accueilclient.client.om.IIndicateursDemat;
import fr.generali.accueilclient.client.om.IPersonnePhysique;
import fr.generali.accueilclient.client.om.ISphereProfessionnelle;
import fr.generali.accueilclient.client.om.NaturePersonne;
import fr.generali.accueilclient.client.om.impl.SphereProfessionnelle;
import fr.generali.accueilclient.utils.constantes.CodeEtatPersonneEnum;
import fr.generali.accueilclient.utils.constantes.CodePopulationEnum;
import fr.generali.accueilclient.utils.constantes.NaturePersonneEnum;
import fr.generali.accueilclient.utils.constantes.StatutClientEnum;
import fr.generali.refservcommuns.clients.prima.DateRange;
import fr.generali.refservcommuns.clients.prima.DatedMonetaryQuantityRangeValue;
import fr.generali.refservcommuns.clients.prima.DatedQuantityRangeValue;
import fr.generali.refservcommuns.rce.demat.servperscom.pty.detailspersonnes.DtoProcedureJudiciaire;
import fr.generali.refservcommuns.rce.demat.servperscom.pty.detailspersonnes.DtoResultatFinancierAExport;
import fr.generali.refservcommuns.rce.demat.servperscom.pty.detailspersonnes.DtoResultatFinancierFrance;
import fr.generali.refservcommuns.rce.demat.servperscom.pty.detailspersonnes.DtoSuiviAnnuelEntreprise;
import fr.generali.refservcommuns.rce.demat.servperscom.pty.gestionrelationsaffaire.DtoRelationClient;
import fr.generali.refservcommuns.rce.demat.servperscom.pty.personnes.DtoEntreprise;
import fr.generali.refservcommuns.rce.demat.servperscom.pty.personnes.DtoIndicateurDematerialisation;
import fr.generali.refservcommuns.rce.demat.servperscom.pty.personnes.DtoPersonneMorale;
import fr.generali.refservcommuns.rce.demat.servperscom.pty.personnes.DtoSecteurActivite;
import fr.generali.refservcommuns.rce.demat.servperscom.pty.personnes.DtoVisibilite;

/**
 * Partie PM du professionnel
 * 
 * @author selrhazala
 */
@Component("personnePhysiqueToDtoPersonneMoraleConverter")
public class PersonnePhysiqueToDtoPersonneMoraleConverter implements Converter<IPersonnePhysique, DtoPersonneMorale> {

    /**
     * LOGGER
     */
    private static final Logger LOGGER = LoggerFactory.getLogger(PersonnePhysiqueToDtoPersonneMoraleConverter.class);

    /**
     * {@inheritDoc}
     */
    public DtoPersonneMorale convert(IPersonnePhysique personnePhysique) {
        // init date du jour
        XMLGregorianCalendar dateDuJour = null;
        try {
            GregorianCalendar gCalendar1 = new GregorianCalendar();
            gCalendar1.setTime(new Date());
            dateDuJour = DatatypeFactory.newInstance().newXMLGregorianCalendar(gCalendar1);
        } catch (DatatypeConfigurationException e) {
            LOGGER.debug("erreur datatype configuration");
        }

        IClientProfessionnel clientProfessionnel = IClientProfessionnel.class.cast(personnePhysique);

        if (clientProfessionnel.getSphereProfessionnelle() == null) {
            clientProfessionnel.setSphereProfessionnelle(new SphereProfessionnelle());
        }

        // RG : "Si le sigle n'est pas renseigné, passer le nom au service"
        if (StringUtils.isEmpty(clientProfessionnel.getSphereProfessionnelle().getRaisonSociale())) {
            clientProfessionnel.getSphereProfessionnelle().setRaisonSociale(personnePhysique.getNom());
        }

        return buildProfessionnelPM(clientProfessionnel, dateDuJour);
    }

    /**
     * @param clientProfessionnel le client professionnel
     * @param dateDuJour la date du jour
     * @return DtoPersonneMorale
     */
    public DtoPersonneMorale buildProfessionnelPM(IClientProfessionnel clientProfessionnel,
                    XMLGregorianCalendar dateDuJour) {
        DtoPersonneMorale dtoPersonneMorale = new DtoPersonneMorale();

        dtoPersonneMorale.setDenominationFUE(clientProfessionnel.getIdClientFue());
        dtoPersonneMorale.setNaturePersonne(NaturePersonneEnum.NATURE_MORALE.getCode());
        dtoPersonneMorale.setStatutClient(StatutClientEnum.CODE_STATUT_CLIENT_PP.getCode());
        dtoPersonneMorale.setTypePersonneMorale(NaturePersonne.ENTREPRISE.getValue());
        dtoPersonneMorale.setVip(clientProfessionnel.isClientVIP());
        dtoPersonneMorale.setRaisonConnaissanceTiers(clientProfessionnel.getOrigineClient());
        dtoPersonneMorale.setDateCreation(dateDuJour);
        dtoPersonneMorale.setEtat(CodeEtatPersonneEnum.CODE_ETAT_0.getCode());

        if (clientProfessionnel.getDateDebut() != null) {
            try {
                GregorianCalendar gCalendar4 = new GregorianCalendar();
                gCalendar4.setTime(clientProfessionnel.getDateDebut());
                XMLGregorianCalendar xmlCalendar4 = DatatypeFactory.newInstance().newXMLGregorianCalendar(gCalendar4);
                dtoPersonneMorale.setDateEtablissement(xmlCalendar4);
            } catch (DatatypeConfigurationException e) {
                LOGGER.debug("erreur datatype configuration");
            }
        }

        DtoProcedureJudiciaire dtoProcedureJudiciaire = new DtoProcedureJudiciaire();
        dtoProcedureJudiciaire.setTypeProcedureJudiciaire(clientProfessionnel.getTypeProcedure());

        if (clientProfessionnel.getDateJugement() != null) {
            try {
                GregorianCalendar gCalendar5 = new GregorianCalendar();
                gCalendar5.setTime(clientProfessionnel.getDateJugement());
                XMLGregorianCalendar xmlCalendar5 = DatatypeFactory.newInstance().newXMLGregorianCalendar(gCalendar5);
                dtoProcedureJudiciaire.setDateJugement(xmlCalendar5);
            } catch (DatatypeConfigurationException e) {
                LOGGER.debug("erreur datatype configuration");
            }
        }

        List<DtoProcedureJudiciaire> listePJ = new ArrayList<DtoProcedureJudiciaire>();
        listePJ.add(dtoProcedureJudiciaire);
        dtoPersonneMorale.getProcedureJudiciaire().addAll(listePJ);

        DtoRelationClient dtoRelationClient = new DtoRelationClient();
        dtoRelationClient.setTitreCourrier(clientProfessionnel.getTitreCourrier());
        dtoPersonneMorale.setRelationClient(dtoRelationClient);

        DtoSecteurActivite dtoSecteurActivite = new DtoSecteurActivite();
        dtoSecteurActivite.setCode(clientProfessionnel.getSecteurActivite());
        dtoPersonneMorale.setSecteurActivite(dtoSecteurActivite);

        DtoVisibilite dtoVisibilite = new DtoVisibilite();
        dtoVisibilite.setIdentifiantIntermediaire(clientProfessionnel.getCodeIntermediaire());
        dtoVisibilite.setIdentifiantClientAgent(clientProfessionnel.getNumeroClientAgent());
        dtoVisibilite.setIdentifiantPointVente(clientProfessionnel.getPointDeVente());
        dtoVisibilite.setIdentifiantChargeClientele(clientProfessionnel.getChargeClientele());
        dtoVisibilite.setCodePopulation(CodePopulationEnum.POPULATION_ACC.getCode());
        dtoPersonneMorale.setVisibilite(dtoVisibilite);

        ISphereProfessionnelle sphereProfessionnelle = clientProfessionnel.getSphereProfessionnelle();
        if (sphereProfessionnelle != null) {
            dtoPersonneMorale.setRaisonSociale(sphereProfessionnelle.getRaisonSociale());
            dtoPersonneMorale.setNomCommercial(sphereProfessionnelle.getRaisonSociale());
            dtoPersonneMorale.setSigle(sphereProfessionnelle.getRaisonSociale());
            dtoPersonneMorale.setCodeNAF(sphereProfessionnelle.getCodeNaf());
            dtoPersonneMorale.setFormeJuridique(sphereProfessionnelle.getFormeJuridique());

            if (StringUtils.isNotEmpty(sphereProfessionnelle.getMoisClotureComptable())) {
                dtoPersonneMorale.setMoisClotureComptable(BigInteger.valueOf(Long.parseLong(sphereProfessionnelle
                                .getMoisClotureComptable())));
            }

            if (sphereProfessionnelle.getDateCreationEntreprise() != null) {
                try {
                    GregorianCalendar gCalendar4 = new GregorianCalendar();
                    gCalendar4.setTime(sphereProfessionnelle.getDateCreationEntreprise());
                    XMLGregorianCalendar xmlCalendar4 =
                                    DatatypeFactory.newInstance().newXMLGregorianCalendar(gCalendar4);
                    dtoPersonneMorale.setDateEtablissement(xmlCalendar4);
                } catch (DatatypeConfigurationException e) {
                    LOGGER.debug("erreur datatype configuration");
                }
            }

            List<DtoResultatFinancierFrance> resultatFinancier = new ArrayList<DtoResultatFinancierFrance>();
            DtoResultatFinancierFrance dtoResultatFinancierFrance = new DtoResultatFinancierFrance();
            DatedMonetaryQuantityRangeValue dmqrvPM = new DatedMonetaryQuantityRangeValue();
            dmqrvPM.setCodeIndicateurSaisie(sphereProfessionnelle.getNiveauCA());
            dtoResultatFinancierFrance.setChiffreAffaireBorne(dmqrvPM);

            if (StringUtils.isNotEmpty(sphereProfessionnelle.getAnneeExercice())) {
                DateRange dateRange = new DateRange();
                try {
                    GregorianCalendar gCalendar6 = new GregorianCalendar();
                    gCalendar6.set(Integer.parseInt(sphereProfessionnelle.getAnneeExercice()), 1, 1);
                    XMLGregorianCalendar anneeExercice =
                                    DatatypeFactory.newInstance().newXMLGregorianCalendar(gCalendar6);
                    dateRange.setStartDate(anneeExercice);
                } catch (DatatypeConfigurationException e) {
                    LOGGER.debug("erreur datatype configuration");
                }

                dtoResultatFinancierFrance.setPeriodeConsideree(dateRange);
            }

            resultatFinancier.add(dtoResultatFinancierFrance);
            dtoPersonneMorale.getResultatFinancier().addAll(resultatFinancier);

            // résultat financier export
            List<DtoResultatFinancierAExport> resultatFinancierAExport = new ArrayList<DtoResultatFinancierAExport>();
            DtoResultatFinancierAExport dtoResultatFinancierAExport = new DtoResultatFinancierAExport();
            DatedMonetaryQuantityRangeValue dmqrvPMAExport = new DatedMonetaryQuantityRangeValue();
            dmqrvPMAExport.setCodeIndicateurSaisie(sphereProfessionnelle.getPartCAExport());

            if (StringUtils.isNotEmpty(sphereProfessionnelle.getAnneeExercice())) {
                dtoResultatFinancierAExport.setAnnee(BigInteger.valueOf(Long.parseLong(sphereProfessionnelle
                                .getAnneeExercice())));
            }

            dtoResultatFinancierAExport.setChiffreAffaireAExportBorne(dmqrvPMAExport);
            resultatFinancierAExport.add(dtoResultatFinancierAExport);
            dtoPersonneMorale.getResultatFinancierAExport().addAll(resultatFinancierAExport);

            DtoSuiviAnnuelEntreprise dtoSuiviAnnuelEntreprise = new DtoSuiviAnnuelEntreprise();
            if (StringUtils.isNotEmpty(sphereProfessionnelle.getNbSalaries())) {
                DatedQuantityRangeValue dmqNbSalaries = new DatedQuantityRangeValue();
                dmqNbSalaries.setCodeIndicateurSaisie(sphereProfessionnelle.getNbSalaries());
                dtoSuiviAnnuelEntreprise.setNombreEmployesBorne(dmqNbSalaries);
            }

            if (StringUtils.isNotEmpty(sphereProfessionnelle.getAnneeExercice())) {
                dtoSuiviAnnuelEntreprise.setExercice(BigInteger.valueOf(Long.parseLong(sphereProfessionnelle
                                .getAnneeExercice())));
            }

            if (StringUtils.isNotEmpty(sphereProfessionnelle.getNbCadres())) {
                DatedQuantityRangeValue dmqNbCadres = new DatedQuantityRangeValue();
                dmqNbCadres.setCodeIndicateurSaisie(sphereProfessionnelle.getNbCadres());
                dtoSuiviAnnuelEntreprise.setNombreCadresBorne(dmqNbCadres);
            }
            List<DtoSuiviAnnuelEntreprise> listeSAE = new ArrayList<DtoSuiviAnnuelEntreprise>();
            listeSAE.add(dtoSuiviAnnuelEntreprise);
            dtoPersonneMorale.getSuiviAnnuelEntreprise().addAll(listeSAE);

            DtoEntreprise dtoEntreprise = new DtoEntreprise();
            dtoEntreprise.setCodeNIC(sphereProfessionnelle.getCodeNic());
            dtoEntreprise.setCodeSIREN(sphereProfessionnelle.getSiren());
            dtoEntreprise.setCaisseRetraite(sphereProfessionnelle.getCaisseRetraite());
            dtoPersonneMorale.setEntreprise(dtoEntreprise);
            
            
            if (clientProfessionnel.getIndicateursDemat() != null) {

                Converter<IIndicateursDemat, List<DtoIndicateurDematerialisation>> converterIndDemat =
                                new IndicateursDemat2DtoIndicateurDematConverter();

                List<DtoIndicateurDematerialisation> listeDtoIndDemat =
                                converterIndDemat.convert(clientProfessionnel.getIndicateursDemat());

                if (CollectionUtils.isNotEmpty(listeDtoIndDemat)) {
                    dtoPersonneMorale.getInformationDematerialisation().addAll(listeDtoIndDemat);
                }
            }
        }

        return dtoPersonneMorale;
    }

}
